<?php
/**
 * --------------------------------------------------------------
 * 控制器根类
 * Author: zd <kfzphp@126.com>
 * Date: 2018-06-01
 * Project: kfzphp.com
 * --------------------------------------------------------------
 */

class Controller extends App
{
    public function __construct()
    {
        parent::__construct();
        // 加载流程
        self::loadHandle();
    }

    /**
     * 判断加载流程
     * @return [type]     [description]
     */
    private function loadHandle()
    {
        if(!IS_AJAX) {
            // 非Ajax情况下
            $this->tpl = self::loadSmarty();
            // 加载静态工具类
            require_once MASTER_PATH . '/KfzTools.class.php';
            class_alias('KfzTools','Tools');
        } else {
            // 如果是Ajax
        }
        // 加载模型类
        $this->model = self::loadModel();
    }

    /**
     * 加载模块模型
     * @return [type]     [模型对象只有加载成功才会正常返回，否则返回false]
     */
    private function loadModel()
    {
        // 模型名称
        $model_name = ucfirst(CONTROLLER_NAME) . 'Model';
        // 创建控制器对应的模型对象
        if(class_exists($model_name)) {
            return new $model_name();
        }
        return false;
    }

    /**
     * 加载Smarty
     * @return [type]     [description]
     */
    private function loadSmarty()
    {
        if(!$this->config['TPL_STATUS']) {
            return false;
        }
        // 创建Smarty对象
        require_once VENDOR_PATH . '/smarty/Smarty.class.php';
        $smarty = new Smarty();
        // 默认模板目录的设置
        $smarty->template_dir = TEMPLATE_PATH . '/' . MODULE_NAME . '/';
        // 保存模板编译文件的目录名称
        $smarty->compile_dir =  COMPILE_PATH . '/' . MODULE_NAME . '/';
        // 设置存储 配置文件的目录
        $smarty->config_dir = CONFIG_PATH . '/';
        // 开启缓存
        // 让每个缓存的过期时间都可以在display执行前单独设置
        $cache_on = !empty($this->config['TPL_CACHE_ON']) ? Smarty::CACHING_LIFETIME_CURRENT : Smarty::CACHING_OFF;
        $smarty->setCaching($cache_on);
        // 设置缓存目录
        $smarty->setCacheDir(CACHE_PATH . '/' . MODULE_NAME . '/');
        // 开启时每次执行都重新缓存模板
        // 默认 false
        $smarty->force_cache = false;
        // 定义模板缓存文件的有效时间（按秒）
        // 当缓存过期了或模板文件发生修改，该缓存将被重新生成
        // -1，则设置缓存永不过期，只有当 force_cache 为 false 的时候有效
        $smarty->setCacheLifetime($this->config['TPL_CACHE_TIME']);
        // 开启时总是会重新生成缓存文件
        // 默认 false
        $smarty->force_compile = false;
        // 开启的时候，每个模板文件和配置文件都会在缓存检查的时候执行编译检查
        // 如果这些文件在缓存生成后被修改，那么缓存会马上重新生成
        // 默认 true
        $smarty->setCompileCheck(true);
        // 模板语法中的左限定符
        $smarty->left_delimiter = $this->config['TPL_L_DELIM'];
        // 模板语法中的右限定符
        $smarty->right_delimiter = $this->config['TPL_R_DELIM'];
        // Smarty将在编译目录和缓存目录下面创建子目录
        if($this->config['TPL_SUB_DIRS']) {
            $smarty->use_sub_dirs = true;
        }
        return $smarty;
    }

    /**
     * 模块赋值
     * @param  [type]  $key     [键]
     * @param  [type]  $val     [值]
     * @param  boolean $nocache [该变量不进行缓存]
     */
    protected function show($key, $val, $nocache = false)
    {
        $this->tpl->assign($key, $val, $nocache);
    }

    /**
     * 显示模板
     * @param  [type] $cache_id   [缓存标识id]
     * @param  [type] $compile_id [编译标识id]
     * @param  string $html       [模板资源路径]
     */
    protected function view($cache_id = null, $compile_id = null, $html = '')
    {
        // 网页字符编码
        if($this->config['HTTP_CONTENT_TYPE']) header('Content-Type:' . $this->config['HTTP_CONTENT_TYPE'] . '; charset=' . $this->config['HTTP_CHARSET']);
        if($this->config['HTTP_CACHE_CONTROL']) header('Cache-control: ' . $this->config['HTTP_CACHE_CONTROL']);  // 页面缓存控制
        if($this->config['HTTP_X_POWERED_BY']) header('X-Powered-By:' . $this->config['HTTP_X_POWERED_BY']);   //
        // 模板文件名称
        $html = self::tplname($html);
        $this->tpl->display($html, $cache_id, $compile_id);
    }

    /**
     * 清除缓存和编译
     * @param  [type] $cache_id   [缓存标识id，ALL清除全部缓存]
     * @param  [type] $compile_id [编译标识id]
     * @param  string $html       [模板资源路径]
     */
    protected function clear($cache_id = null, $compile_id = null, $html = '')
    {
        switch ($cache_id) {
            case 'ALL':
                // 清除整个编译目录的文件
                $this->tpl->clearCompiledTemplate();
                // 清除全部缓存
                $this->tpl->clearAllCache();
                break;
            default:
                // 模板文件名称
                $html = self::tplname($html);
                // 模板文件删除
                if($this->tpl->isCached($html, $cache_id, $compile_id)) {
                    // 清除特定的已编译模板
                    $this->tpl->clearCompiledTemplate($html);
                    // 清除多个缓存的模板中某个特定缓存id的缓存
                    $this->tpl->clearCache($html, $cache_id, $compile_id);
                }
                break;
        }
    }

    /**
     * 模板名称
     * @param  string $html [模板路径]
     * @return [type]       [模板名称]
     */
    protected function tplname($html = '')
    {
        // 模板文件名称
        if(empty($html)) {
            // 模块文件定义
            $tpl_filename = ucfirst(CONTROLLER_NAME) . '_' . ACTION_NAME;   // 模板名称
            $tpl_suffix = $this->config['TPL_SUFFIX'] ? $this->config['TPL_SUFFIX'] : '.tpl';   // 模板扩展
            $html = $tpl_filename . $tpl_suffix;
        }
        return $html;
    }
}